From ba5fb52ddacae26b47e948b777c4f03484cdbe61 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Tue, 2 Aug 2005 19:08:28 +0000 Subject: [PATCH] Fix SMP save/restore for 1 vcpu by adding suspend/resume functions for SMP. We have to free_irq the irq vectors for the SMP ipi vectors. Signed-off-by: Christian Limpach --- .../arch/xen/i386/kernel/smpboot.c | 23 ++++++++++++++++++- linux-2.6-xen-sparse/arch/xen/kernel/reboot.c | 12 ++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/kernel/smpboot.c b/linux-2.6-xen-sparse/arch/xen/i386/kernel/smpboot.c index 485fc6abcf..f8ef335b6b 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/smpboot.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/smpboot.c @@ -1529,7 +1529,7 @@ void __init smp_cpus_done(unsigned int max_cpus) extern irqreturn_t smp_reschedule_interrupt(int, void *, struct pt_regs *); extern irqreturn_t smp_call_function_interrupt(int, void *, struct pt_regs *); -void __init smp_intr_init(void) +void smp_intr_init(void) { int cpu = smp_processor_id(); @@ -1546,3 +1546,24 @@ void __init smp_intr_init(void) smp_call_function_interrupt, SA_INTERRUPT, callfunc_name[cpu], NULL)); } + +static void smp_intr_exit(void) +{ + int cpu = smp_processor_id(); + + free_irq(per_cpu(resched_irq, cpu), NULL); + unbind_ipi_from_irq(RESCHEDULE_VECTOR); + + free_irq(per_cpu(callfunc_irq, cpu), NULL); + unbind_ipi_from_irq(CALL_FUNCTION_VECTOR); +} + +void smp_suspend(void) +{ + smp_intr_exit(); +} + +void smp_resume(void) +{ + smp_intr_init(); +} diff --git a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c index 99f679c00f..5c99babb26 100644 --- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c +++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c @@ -91,6 +91,10 @@ static void __do_suspend(void) #define gnttab_resume() do{}while(0) #endif +#ifdef CONFIG_SMP + extern void smp_suspend(void); + extern void smp_resume(void); +#endif extern void time_suspend(void); extern void time_resume(void); extern unsigned long max_pfn; @@ -115,6 +119,10 @@ static void __do_suspend(void) time_suspend(); +#ifdef CONFIG_SMP + smp_suspend(); +#endif + xenbus_suspend(); ctrl_if_suspend(); @@ -158,6 +166,10 @@ static void __do_suspend(void) xenbus_resume(); +#ifdef CONFIG_SMP + smp_resume(); +#endif + time_resume(); blkdev_resume(); -- 2.30.2